package com.fzkj.juc;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @DESCRIPTION  volatile关键字测试类
 */
public class VolatileTest {

    public static void main(String[] args) {
        atomicity();
    }

    // 原子性
    public static void atomicity(){
        Number num = new Number();
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    num.add();
                    num.atomicAdd();
                }
            }).start();

        }
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(num.num);
        System.out.println(num.atomicInteger);
    }

    // 可见性
//    private static void visibility(){
//        Number number = new Number();
//
//        new Thread(() -> {
//            try {
//                TimeUnit.SECONDS.sleep(1);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            number.numTo(20);
//            System.out.println(Thread.currentThread().getName() + ":\t number的值是： " + number.num);
//        }, "A线程").start();
//
//        while(number.num == 0){
//        }
//
//        System.out.println(Thread.currentThread().getName() + ":\t number的值是： " + number.num);
//    }
}

class Number{
     int num = 0;
     AtomicInteger atomicInteger = new AtomicInteger();

    public void numTo(int target){
        this.num = target;
    }

    public void add(){
        this.num++ ;
    }

    public void atomicAdd(){
        atomicInteger.getAndIncrement();
    }
}
